|
ミューテータ関数の例
このページは、2008 年 4 月 01 日に最後に変更されました。
edocs ホーム > BEA AquaLogic Data Services Platform 3.0/3.2 ドキュメント > ALDSP 3.2 新機能のドキュメント
|
| この例では、$ce の各子要素の値が $va の対応する子要素の値 (同名を使用して) に置き換えるヘルパー プロシージャを含んでいることに注意してください。 |
declare procedure tns:replace-values($ce as changed-element(),
$path as xs:string,
$va as element()) as changed-element() {
declare $parent as changed-element() := $ce;
declare $child as element() := fn-bea:current-value($ce);
(: $path に従っって手動でナビゲーション :)
iterate $step over tokenize($path, "/|[") {
if (starts-with($step, "[") {
(: これはフィルタ (位置のフィルタが前提) であり、削除する。)
(: フィルタの角括弧であって、同じフィルタに適用する。:)
set $index as xs:string := substring($step, 2, string-length($step) - 2);
set $child := $child[xs:integer($index)]
} else {
set $child := $child/[local-name() eq $step]
}
}
iterate $leaf over $child/* {
declare $vaChild as element() := $va/*[local-name() eq local-name($leaf)];
if (exists($vaChild)) {
declare $cpath = concat($path, "/", local-name($leaf));
set $parent := fn-bea:replace-value($parent, $cpath, data($vaChild));
}
}
return value $parent;
}
declare procedure tns:update($p1 as element(p_customer)) {
declare $cust as element(customer) := getCustomerByCustID($p1/customer_id);
declare $ucust as changed-element(customer) := fn-bea:changed-element($cust);
iterate $addr at $i over $p1/address {
declare $uaddr as element(AddressType) :=
<address>
<address_id>{ data($addr/address_id) }</address_id>
<customer_id>{ data($addr/customer_id) }</customer_id>
<city>{ data($addr/city) }</city>
<street1>{ data($addr/street1) }</street1>
<street2>{ data($addr/street1) }</street2>
<address_type>{ data($addr/address_type) }</address_type>
</address>
if (exists($cust/address[$i])) {
declare $path as xs:string := concat("address[", $i , "]");
set $ucust := tns:replace-values($ucust, $path, $uaddr);
} else {
set $ucust := fn-bea:insert-into($ucust, ".", $uaddr);
}
}
tns:updateCustomer($uCustomer);
}
この例では、2 つの複合パラメータに基づく更新操作の実行方法を示します。1 つのパラメータは古い値を含め、他のパラメータは新しい値を含む可能性があります。
この例では、以下の入力パラメータが使用されます。
customer パラメータ (新規値)
<customer> <customer_id>1</customer_id> <first_name>John</first_name> <last_name>Smith</last_name> <ssn>345-43-4988</ssn> </customer>
customer パラメータ (古い値)
<customer> <customer_id>1</customer_id> <first_name>Johnny</first_name> <last_name>Smithline</last_name> <ssn>345-43-4988</ssn> </customer>
以下の例では、一連の if 文を使用して 2 つの入力パラメータ (1 番目は古い値を含め、2 番目は新規値を含む可能性があります) の相違点を比較します。そして、変更が識別された場合、この例では、基底のデータ ソースにデータを更新するためにデータ サービスにおける updateCustomer() 操作を呼び出します。
declare procedure tns:update($p_old as element(customer),
$p_new as element(customer)) {
declare $cust as changed-element(customer) := fn-bea:changed-element($p_old);
declare $modified as xs:boolean := false();
if (data($p_old/customer_id) eq data($p_new/customer_id) ) then {
if (data($p_old/first_name) ne data($p_new/first_name)) then {
set $cust := fn-bea:replace-value($cust, "first_name", fn:data($p_new/first_name));
set $modified := true();
} else {}
if (data($p_old/last_name) ne data($p_new/last_name)) then {
set $cust := fn-bea:replace-value($cust, "last_name", fn:data($p_new/last_name));
set $modified := true();
} else {}
if (data($p_old/ssn) ne data($p_new/ssn)) then {
set $cust := fn-bea:replace-value($cust, "ssn", fn:data($p_new/ssn));
set $modified := true();
} else {}
if ($modified) then {
tns:updatecustomer($c);
} else {}
} else {}
}
以下の例では、要素を通して反復することによって、2 つの入力 パラメータの相違点を比較します。そして、変更が識別された場合、基底のデータ ソースにデータを更新するためにデータ サービスにおける updateCustomer() 操作を呼び出します。
declare procedure tns:update($p_old as element(customer),
$p_new as element(customer)) {
declare $cust as changed-element(customer) := fn-bea:changed-element($p_old);
declare $modified as xs:boolean := false();
if (data($p_old/customer_id) eq data($p_new/customer_id) ) then {
iterate $child over $p_old/* {
declare $name as xs:string := local-name($child);
declare $new := data($p_new/*[local-name() eq $name]);
if (data($child) ne $new) {
set $cust := fn-bea:replace-value($cust, $name, $new);
set $modified := true();
}
}
if ($modified) then {
tns:updatecustomer($c);
}
}
}
この例では、更新操作を実行する前にデータを多彩にするために追加の関数コールを実行する方法を示します。
以下の入力パラメータが使用されます。
p_customer パラメータ
<p_customer> <customer_id>1</customer_id> <ssn>545-54-5445</ssn> <address> <address_id>1</address_id> <city>San Jose</city> <street1>1108 First St.</street1> <street2></street2> <country>US</country> </address> </p_customer>
getCustomerByCustID() 操作は以下のデータを返します。
getCustomerByCustID() で返されたデータ
<customer> <customer_id>1</customer_id> <first_name>John</first_name> <last_name>Deer</last_name> <ssn>123-12-1234</ssn> <address> <address_id>1</address_id> <customer_id>1</customer_id> <city>San Jose</city> <street1>1108 First</street1> <street2></street2> <zip_code>95125</zip_code> <address_valid>N</address_valid> <country>US</country> </address> </customer>
getValidAddress() 操作はパラメータとしてアドレス情報を受け入れて、アドレスが有効であるかどうかを示す妥当性コードと共に標準化されたアドレス要素を返します。getValidAddress() 操作は以下のデータを返します。
getValidAddress() で返されたデータ
<address> <city>San Jose</city> <street1>1108 1st Street</street1> <street2></street2> <zip_code>95131</zip_code> <address_valid>Y</address_valid> <country>US</country> </address>
以下の例では、更新された情報に含めるように追加情報を取得するためにデータ サービスにおける読み取り処理を呼び出します。この例では、次に基底のデータ ソースにデータを更新するために適切な値を置き換えて、updateCustomer() 操作を呼びます。
declare procedure tns:update($p1 as element(p_customer)) {
declare $c as element(customer) := getCustomerByCustID($p1/customer_id, p1/address_id);
declare $cc as changed-element(customer) := fn-bea:changed-element($c);
set $cc := fn-bea:replace-value($cc, "ssn", $p1/ssn);
declare $vAddress as element(ValidAddress) := tns:getValidAddress(
<ns1:address>
<city>{ data($p1/city) }</city>
<street1>{ data($p1/street1) }</street1>
<street2>{ data($p1/stree2) }</street2>
<country>{ data($p1/country) }</country>
</ns1:address>);
set $cc := fn-bea:replace-value($cc, "city", $vAddress/city)
set $cc := fn-bea:replace-value($cc, "street1", $vAddress/street1)
set $cc := fn-bea:replace-value($cc, "street2", $vAddress/street2)
set $cc := fn-bea:replace-value($cc, "zip_code", $vAddress/zip_code)
set $cc := fn-bea:replace-value($cc, "address_valid", $vAddress/address_valid)
set $cc := fn-bea:replace-value($cc, "country", $vAddress/country)
tns:updateCustomer($cc);
}
この例では、変更されたデータを 2 つの異なるデータ ソースに送信する方法を示します。
以下の入力パラメータが使用されます。
p_customer パラメータ
<p_customer> <customer_id>1</customer_id> <ssn>545-54-5445</ssn> <first_name>Johan</first_name> <last_name>Tyson</last_name> <cud_operation>U</cud_operation> <address> <address_id>1</address_id> <city>San Jose</city> <street1>1108 First St.</street1> <street2></street2> <country>US</country> <cud_operation>U</cud _operation> </address> <address> <address_id>1</address_id> <city>San Jose</city> <street1>1108 First St.</street1> <street2></street2> <country>US</country> <cud_operation>D</cud _operation> </address> </p_customer>
以下の例では、顧客情報を読み込んで更新します。最初のデータ ソースのデータで置き換えて、2 番目のデータ ソースで顧客データを挿入します。同様に、この例では、関連のアドレス情報を読み込んで更新します。最初のデータ ソースでデータを置き換えて、2 番目のデータ ソースでアドレス データを挿入します。
declare procedure tns:update($p1 as element(p_customer)) {
declare $c as element(customer) := getCustomerInfoByCustID(data($p1/customer_id));
declare $cc as changed-element(customer) := fn-bea:changed-element($c);
declare $curc as element(customer);
if (data($p1/cud_operation) eq "U") then {
set $cc := fn-bea:replace-value($cc, "first_name", data($p1/first_name));
set $cc := fn-bea:replace-value($cc, "last_name", data($p1/last_name));
set $cc := fn-bea:replace-value($cc, "ssn", data($p1/ssn));
updateCustomer($cc); (: これは 1 番目のデータ ソースで更新されます。:)
set $curc := fn-bea:current-value($cc);
insertCustomer($curc); (: これは、 2 番目のデータ ソースで挿入されます。:)
}
{
declare $addr as element(address) := getAddressInfoByCustID(data($p1/customer_id));
declare $caddr as changed-element(address) := fn-bea:changed-element($addr);
declare $curaddr as element(address);
declare $paddr := $p1/address[1];
if (data($p1/cud_operation) eq "U") then {
set $caddr := fn-bea:replace-value($caddr, "city", data($paddr/city));
set $caddr := fn-bea:replace-value($caddr, "street1", data($paddr/street1));
set $caddr := fn-bea:replace-value($caddr, "street2", data($paddr/street2));
set $caddr := fn-bea:replace-value($caddr, "country", data($paddr/country));
updateAddress($caddr); (: これは 1 番目のデータ ソースで更新されます。:)
set $curaddr :=
<address>
<address_id>{ data($paddr/address_id) }</address_id>
<city>{ data($paddr/city) }</city>
<street1>{ data($paddr/street1) }</street1>
<street2>{ data($paddr/street2) }</street2>
<country>{ data($paddr/country) }</country>
</address>
insertAddress($curaddr); (: これは、2 番目のデータ ソースで挿入されます。:)
}
}
}
| 2008 年 04 月 10 日に 11:47 に Confluence によって作成されたドキュメント |